## For implicit dynamic symbol table sections, `Size` and/or `Content`
## fields can also be specified in YAML. Here we test the behavior in
## different cases.

## When no `Size` or `Content` is specified for a dynamic symbol table section,
## yaml2obj writes the default content.

# RUN: yaml2obj --docnum=1 %s -o %t1
# RUN: llvm-readelf %t1 --dyn-symbols | FileCheck %s --check-prefix=CASE1

# CASE1:      Symbol table '.dynsym' contains 2 entries:
# CASE1-NEXT:    Num:    Value          Size Type    Bind   Vis      Ndx Name
# CASE1-NEXT:      0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND
# CASE1-NEXT:      1: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND foo
# CASE1-EMPTY:

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_DYN
Sections:
  - Name: .dynsym
    Type: SHT_DYNSYM
DynamicSymbols:
  - Name:    foo
    Binding: STB_GLOBAL

## Specifying both `Size` and symbols at the same time is not allowed for .dynsym.

# RUN: not yaml2obj --docnum=2 %s 2>&1 | FileCheck %s --implicit-check-not=error --check-prefix=CASE2
# RUN: not yaml2obj --docnum=3 %s 2>&1 | FileCheck %s --implicit-check-not=error --check-prefix=CASE2

# CASE2: yaml2obj: error: cannot specify both `Size` and `DynamicSymbols` for symbol table section '.dynsym'

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_DYN
Sections:
  - Name: .dynsym
    Type: SHT_DYNSYM
    Size: 0x100
  - Name: .dynsym2
    Type: SHT_DYNSYM
    Size: 0x100
DynamicSymbols:
  - Name:    foo
    Binding: STB_GLOBAL

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_DYN
Sections:
  - Name: .dynsym
    Type: SHT_DYNSYM
    Size: 0x100
  - Name: .dynsym2
    Type: SHT_DYNSYM
    Size: 0x100
DynamicSymbols: []

## Specifying both `Content` and symbols at the same time is not allowed for .dynsym.

# RUN: not yaml2obj --docnum=4 %s 2>&1 | FileCheck %s --implicit-check-not=error --check-prefix=CASE3
# RUN: not yaml2obj --docnum=5 %s 2>&1 | FileCheck %s --implicit-check-not=error --check-prefix=CASE3

# CASE3: yaml2obj: error: cannot specify both `Content` and `DynamicSymbols` for symbol table section '.dynsym'

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_DYN
Sections:
  - Name:    .dynsym
    Type:    SHT_DYNSYM
    Content: "00"
  - Name:    .dynsym2
    Type:    SHT_DYNSYM
    Content: "00"
DynamicSymbols:
  - Name:    foo
    Binding: STB_GLOBAL

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_DYN
Sections:
  - Name:    .dynsym
    Type:    SHT_DYNSYM
    Content: "00"
  - Name:    .dynsym2
    Type:    SHT_DYNSYM
    Content: "00"
DynamicSymbols: []

## Check we can use just `Content` to emit custom data in the symbol table section.
# RUN: yaml2obj --docnum=6 %s -o %t4
# RUN: llvm-readobj --section-data -S %t4 | FileCheck %s --check-prefix=CASE4

# CASE4:      Name: .dynsym
# CASE4-NEXT: Type: SHT_DYNSYM
# CASE4-NEXT: Flags [
# CASE4-NEXT:   SHF_ALLOC
# CASE4-NEXT: ]
# CASE4-NEXT: Address: 0x0
# CASE4-NEXT: Offset: 0x40
# CASE4-NEXT: Size: 2
# CASE4-NEXT: Link: 0
# CASE4-NEXT: Info: 1
# CASE4-NEXT: AddressAlignment: 0
# CASE4-NEXT: EntrySize: 24
# CASE4-NEXT: SectionData (
# CASE4-NEXT:   0000: 0123
# CASE4-NEXT: )

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_DYN
Sections:
  - Name: .dynsym
    Type: SHT_DYNSYM
    Content: "0123"

## Check we can use just `Size` to emit custom data filled with zeroes
## in the symbol table section.
# RUN: yaml2obj --docnum=7 %s -o %t5
# RUN: llvm-readobj --section-data -S %t5 | FileCheck %s --check-prefix=CASE5

# CASE5:      Name: .dynsym
# CASE5-NEXT: Type: SHT_DYNSYM
# CASE5-NEXT: Flags [
# CASE5-NEXT:   SHF_ALLOC
# CASE5-NEXT: ]
# CASE5-NEXT: Address: 0x0
# CASE5-NEXT: Offset: 0x40
# CASE5-NEXT: Size: 5
# CASE5-NEXT: Link: 0
# CASE5-NEXT: Info: 1
# CASE5-NEXT: AddressAlignment: 0
# CASE5-NEXT: EntrySize: 24
# CASE5-NEXT: SectionData (
# CASE5-NEXT:   0000: 00000000 00
# CASE5-NEXT: )

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_DYN
Sections:
  - Name: .dynsym
    Type: SHT_DYNSYM
    Size: 5

## Check we can specify both `Size` and `Content` when size is greater
## than content size. In this case zeroes are added as padding
## after after the specified content.

# RUN: yaml2obj --docnum=8 %s -o %t6
# RUN: llvm-readobj %t6 --section-data -S | FileCheck %s --check-prefix=CASE6

# CASE6:      Name: .dynsym
# CASE6-NEXT: Type: SHT_DYNSYM
# CASE6-NEXT: Flags [
# CASE6-NEXT:   SHF_ALLOC
# CASE6-NEXT: ]
# CASE6-NEXT: Address: 0x0
# CASE6-NEXT: Offset: 0x40
# CASE6-NEXT: Size: 4
# CASE6-NEXT: Link: 0
# CASE6-NEXT: Info: 1
# CASE6-NEXT: AddressAlignment: 0
# CASE6-NEXT: EntrySize: 24
# CASE6-NEXT: SectionData (
# CASE6-NEXT:   0000: 01230000
# CASE6-NEXT: )

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_DYN
Sections:
  - Name: .dynsym
    Type: SHT_DYNSYM
    Content: "0123"
    Size: 4

## Check we can specify both `Size` and `Content` when size is
## equal to content size.

# RUN: yaml2obj --docnum=9 %s -o %t7
# RUN: llvm-readobj --section-data -S %t7 | FileCheck %s --check-prefix=CASE7

# CASE7:       Name: .dynsym
# CASE7-NEXT:  Type: SHT_DYNSYM
# CASE7-NEXT:  Flags [
# CASE7-NEXT:    SHF_ALLOC
# CASE7-NEXT:  ]
# CASE7-NEXT:  Address: 0x0
# CASE7-NEXT:  Offset: 0x40
# CASE7-NEXT:  Size: 2
# CASE7-NEXT:  Link: 0
# CASE7-NEXT:  Info: 1
# CASE7-NEXT:  AddressAlignment: 0
# CASE7-NEXT:  EntrySize: 24
# CASE7-NEXT:  SectionData (
# CASE7-NEXT:    0000: 0123
# CASE7-NEXT:  )

--- !ELF
FileHeader:
  Class: ELFCLASS64
  Data:  ELFDATA2LSB
  Type:  ET_DYN
Sections:
  - Name: .dynsym
    Type: SHT_DYNSYM
    Content: "0123"
    Size: 2
